package com.zijidelu.luframework.infrastructure.factory;

import com.zijidelu.luframework.domain.model.entity.EntityRelation;

import java.util.Optional;
import java.util.Set;

/**
 * 聚合缓存接口。
 * <p>
 * 自动扫描器写入聚合缓存。
 *
 * @author ZIJIDELU
 * @datetime 2025/11/19 23:21
 */
public interface AggregateVault {
    /**
     * 注册父->子关系
     *
     * @param rootEntityClass  父实体类型
     * @param childEntityClass 子实体类型
     */
    EntityRelation registerEntityRelation(final Class<?> rootEntityClass, final Class<?> childEntityClass);

    /**
     * 注册父->子关系
     *
     * @param childEntityClass 子实体类型
     */
    EntityRelation registerEntityRelationWithChild(final Class<?> childEntityClass);

    /**
     * 注册父->子关系
     * 检查实体类是否符合要求,不符合要求返回null。
     * 使用场景，扫描器不关心类型是子实体还是父实体，只关心是否符合要求。
     *
     * @param childEntityClass 子实体类型
     */
    EntityRelation registerEntityRelationWithChildNoCheck(final Class<?> childEntityClass);

    /**
     * 获取实体关系
     *
     * @param childEntityClass 子实体类型
     * @return 实体关系
     */
    Optional<EntityRelation> getEntityRelation(Class<?> childEntityClass);

    /**
     * 获取所有子实体类型
     *
     * @param rootEntityClass 父实体类型
     * @return 所有子实体类型
     */
    Set<EntityRelation> getEntityRelationSet(Class<?> rootEntityClass);

}
